package com.xunjing.monitor.config;

import com.xunjing.common.core.web.service.EmailService;
import de.codecentric.boot.admin.server.domain.entities.InstanceRepository;
import de.codecentric.boot.admin.server.domain.events.InstanceEvent;
import de.codecentric.boot.admin.server.domain.events.InstanceStatusChangedEvent;
import de.codecentric.boot.admin.server.notify.AbstractStatusChangeNotifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;

/**
 * @Author ZYT
 * @Date 2024-03-22 9:27
 * @Version 1.0
 * @Describe 通知发送配置(spring-boot-admin自带邮箱发送配置，引入mail后只需要配置发送参数即可，其余不用写代码)
 */
@Component
public class SeverStatusChangeNotifier extends AbstractStatusChangeNotifier {
    /**
     * 注入发送邮件的接口
     */
    private final EmailService mailService;
    //Spring Boot 提供了一个发送邮件的简单抽象，使用的是下面这个接口，这里直接注入即可使用
    private final JavaMailSender mailSender;
    // 配置文件中发送者邮箱
    @Value("${spring.boot.admin.notify.mail.to}")
    private String to;
    // 配置文件中发送者邮箱
    @Value("${spring.boot.admin.notify.mail.from}")
    private String from;

    public SeverStatusChangeNotifier(InstanceRepository repository, EmailService mailService, JavaMailSender mailSender) {
        super(repository);
        this.mailService = mailService;
        this.mailSender = mailSender;
    }

    @Override
    protected Mono<Void> doNotify(InstanceEvent event,
                                  de.codecentric.boot.admin.server.domain.entities.Instance instance) {
        return Mono.fromRunnable(() -> {
            if (event instanceof InstanceStatusChangedEvent) {
                String status = ((InstanceStatusChangedEvent) event).getStatusInfo().getStatus();
                switch (status) {
                    // 健康检查没通过
                    case "DOWN":
                        System.out.println("微服务" + instance.getRegistration().getName() + "发送 健康检查没通过 的通知！");
                        break;
                    // 服务离线
                    case "OFFLINE":
                        System.out.println("微服务" + instance.getRegistration().getName() + "发送 服务离线 的通知！");
                        //调用邮箱发送
                        mailService.sendSimpleMail(mailSender, from, to,"SpringAdmin服务监控", "微服务" + instance.getRegistration().getName() + "发送 服务离线 的通知！");
                        break;
                    // 服务上线
                    case "UP":
                        System.out.println("微服务" + instance.getRegistration().getName() + "发送 服务上线 的通知！");
                        break;
                    // 服务未知异常
                    case "UNKNOWN":
                        System.out.println("微服务" + instance.getRegistration().getName() + "发送 服务未知异常 的通知！");
                        //调用邮箱发送
                        mailService.sendSimpleMail(mailSender, from, to, "SpringAdmin服务监控", "微服务" + instance.getRegistration().getName() + "发送 服务未知异常 的通知！");
                        break;
                    default:
                        break;
                }
            }
        });
    }
}
